package singletontest;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * 使用DCL双检查锁机制来实现多线程环境中的延迟加载单例设计模式
 *
 * @author liuziyang
 * @create 2019-10-14 20:36
 */
public class SingletonTest6 {
    private volatile static SingletonTest6 myObject;

    public SingletonTest6() {

    }

    /**
     * 使用DCL双重检查锁功能，成功地解决了“懒汉模式”遇到多线程的问题。DCL也是大多数多线程结合单例模式使用的解决方案。
     *
     * @return
     */
    public static SingletonTest6 getInstance() {
        try {
            if (myObject == null) {
                //模拟对象在创建之前做的一些准备工作
                Thread.sleep(3000);
                synchronized (SingletonTest6.class) {
                    if (myObject == null) {
                        myObject = new SingletonTest6();
                    }
                }
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return myObject;
    }


    public static void main(String[] args) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println(SingletonTest6.getInstance().hashCode());
            }
        }).start();
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println(SingletonTest6.getInstance().hashCode());
            }
        }).start();
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println(SingletonTest6.getInstance().hashCode());
            }
        }).start();
    }
}
